package org.example.functionInterface;

import java.util.function.Consumer;

public class Demo06Consumer {
    /**
     * 注意:    1.con1调用andThen方法,传递参数con2,所以anThen方法内部的this就是con1,after就是con2
     * 2.andThen方法内部调用accept方法,前面隐藏了一个this,this代表调用andThen方法的对象,就是con1
     * 3.andThen方法内部的t是谁?就是最后调用方法accept传递的s        this.accept(t) <==> con1.accept(s)   ①
     * 4.con1调用andThen方法时传递的参数是con2,所以andThen方法内部的after就是con2
     * after.accept(t) <==> con2.accept(s)  ②
     * 5.通过分析,我们发现①和②中的内容,就是之前不用andThen方法,自己进行调用的过程
     * 6.以上分析,仍然是按照面向对象中方法调用的思路展开的,
     * 但实质上,我们要注意,Consumer接口中的andThen方法,返回的是一个Consumer,
     * 里面采用的是lambda表达式,其实是在做函数模型的拼接,把两个函数模型con1和con2拼接出一个新的模型,返回新的模型。
     * 所以con1.andThen(con2)是把con1和con2拼接成一个新的Consumer,返回的是lambda表达式的形式
     * 最后调用accept(s)方法时,其实执行的是lambda表达式{}中的代码
     * @param args
     */
    public static void main(String[] args) {
        String s = "HelloWorld";
        //2.lambda标准格式
        fun(s, (String str) -> {
            System.out.println(s.toUpperCase());
        }, (String str) -> {
            System.out.println(s.toLowerCase());
        });
    }

    /*        定义方法,参数是Consumer接口        因为要消费两次,所以需要两个Consumer接口作为参数     */
    public static void fun(String s, Consumer<String> con1, Consumer<String> con2) {
        con1.andThen(con2).accept(s);
    }
}